Consul 0.5の新機能 Atlas連携を試してみる
ども、大瀧です。
今朝かた、HashiCorpのクラスタオーケストレーションツールConsulのバージョン0.5がリリースされました。多くの新機能が追加されていますが、ここではAtlasとの連携を紹介してみます。
Atlasとは
AtlasはHashiCorpのツールを連携させるクラウドサービスです。Atlasの概要については、こちらの記事を参照ください。従来AtlasはVagrant、Packer、Terraformとの連携機能を持っていたのですが、かねて予告されていたConsulとの連携が今回の新機能です。
連携1: Auto Join
ConsulのAltas連携機能としてAuto Joinが利用できます。Consulでは、既存クラスタに加わるためにクラスタメンバーのIPアドレスを特定し、接続する必要がありました。Auto Joinを利用すると、新規メンバーはAtlasのAPIにメンバー情報をリクエストし、メンバーのIPアドレスを指定することなくクラスタに加わることができます。
Atlasトークンの準備
ConsulからAtlasに接続するための認証情報としてトークンをあらかじめ取得、セットしておきます。Atlasのプロフィール画面の[Tokens]にある[Generate Token]で発行します。
生成されたトークンを控えておきます。
Consulを実行するマシンでは、トークンを環境変数ATLAS_TOKENもしくはconsul agentコマンドの実行時の-atlas-tokenオプションで指定します。今回は環境変数を設定しました。
$ export ATLAS_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXX
これで準備OKです。
ConsulからAtlasへの接続
Consulノードを構成するconsul agentコマンドでAtlasのAuto Joinを実行するためには、-atlas-joinオプションとともに-atlasオプションでAtlasの<Organization名>/<Infrastructure名>を指定します。Organization名は既定ではユーザー名、Infrastructure名は新規作成であれば任意で構いません。2台目以降は同じパラメータを指定することで、同一クラスタへのJoinになります。
$ ./consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul \ -atlas takipone/cluster1 -atlas-join ==> WARNING: BootstrapExpect Mode is specified as 1; this is the same as Bootstrap mode. ==> WARNING: Bootstrap mode enabled! Do not enable unless necessary ==> WARNING: It is highly recommended to set GOMAXPROCS higher than 1 ==> Starting Consul agent... ==> Starting Consul agent RPC... ==> Consul agent running! Node name: 'ip-172-31-20-221' Datacenter: 'dc1' Server: true (bootstrap: true) Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400) Cluster Addr: 172.31.20.221 (LAN: 8301, WAN: 8302) Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false Atlas: (Infrastructure: 'takipone/cluster1' Join: true) ==> Log data will now stream in as it occurs: 2015/02/19 22:37:02 [INFO] serf: EventMemberJoin: ip-172-31-20-221 172.31.20.221 2015/02/19 22:37:02 [INFO] serf: EventMemberJoin: ip-172-31-20-221.dc1 172.31.20.221 2015/02/19 22:37:02 [INFO] raft: Node at 172.31.20.221:8300 [Follower] entering Follower state 2015/02/19 22:37:02 [INFO] consul: adding server ip-172-31-20-221 (Addr: 172.31.20.221:8300) (DC: dc1) 2015/02/19 22:37:02 [INFO] consul: adding server ip-172-31-20-221.dc1 (Addr: 172.31.20.221:8300) (DC: dc1) 2015/02/19 22:37:02 [ERR] agent: failed to sync remote state: No cluster leader 2015/02/19 22:37:04 [WARN] raft: Heartbeat timeout reached, starting election 2015/02/19 22:37:04 [INFO] raft: Node at 172.31.20.221:8300 [Candidate] entering Candidate state 2015/02/19 22:37:04 [INFO] raft: Election won. Tally: 1 2015/02/19 22:37:04 [INFO] raft: Node at 172.31.20.221:8300 [Leader] entering Leader state 2015/02/19 22:37:04 [INFO] consul: cluster leadership acquired 2015/02/19 22:37:04 [INFO] consul: New leader elected: ip-172-31-20-221 2015/02/19 22:37:04 [INFO] raft: Disabling EnableSingleNode (bootstrap) 2015/02/19 22:37:13 [ERR] scada-client: failed to handshake: i/o deadline reached 2015/02/19 22:37:31 [INFO] agent.rpc: Accepted client: 127.0.0.1:45376 2015/02/19 22:39:14 [INFO] scada-client: connect requested (capability: http) 2015/02/19 22:39:15 [INFO] scada-client: connect requested (capability: http)
エラーっぽい表示も出ますが、ひとまずAtlasの画面の様子を見ます。[Runtime] - [Infrastructures]に先ほど指定した項目が追加されていれば、登録できています。
続いて、もう1台ノードを用意し、同様にコマンドを実行してみます。
$ ./consul agent -server -data-dir /tmp/consul \ -atlas takipone/cluster1 -atlas-join ==> WARNING: It is highly recommended to set GOMAXPROCS higher than 1 ==> Starting Consul agent... ==> Starting Consul agent RPC... ==> Consul agent running! Node name: 'ip-172-31-20-106' Datacenter: 'dc1' Server: true (bootstrap: false) Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400) Cluster Addr: 172.31.20.106 (LAN: 8301, WAN: 8302) Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false Atlas: (Infrastructure: 'takipone/cluster1' Join: true) ==> Log data will now stream in as it occurs: 2015/02/20 00:24:43 [INFO] serf: EventMemberJoin: ip-172-31-20-106 172.31.20.106 2015/02/20 00:24:43 [INFO] serf: EventMemberJoin: ip-172-31-20-106.dc1 172.31.20.106 2015/02/20 00:24:43 [INFO] raft: Node at 172.31.20.106:8300 [Follower] entering Follower state 2015/02/20 00:24:43 [INFO] consul: adding server ip-172-31-20-106 (Addr: 172.31.20.106:8300) (DC: dc1) 2015/02/20 00:24:43 [INFO] consul: adding server ip-172-31-20-106.dc1 (Addr: 172.31.20.106:8300) (DC: dc1) 2015/02/20 00:24:43 [ERR] agent: failed to sync remote state: No cluster leader 2015/02/20 00:24:44 [INFO] scada-client: connect requested (capability: http) 2015/02/20 00:24:45 [WARN] raft: EnableSingleNode disabled, and no known peers. Aborting election. 2015/02/20 00:24:45 [INFO] scada-client: auto-joining LAN with [172.31.20.221] 2015/02/20 00:24:45 [INFO] agent: (LAN) joining: [172.31.20.221] 2015/02/20 00:24:45 [INFO] serf: EventMemberJoin: ip-172-31-20-221 172.31.20.221 2015/02/20 00:24:45 [INFO] agent: (LAN) joined: 1 Err: <nil> 2015/02/20 00:24:45 [INFO] consul: adding server ip-172-31-20-221 (Addr: 172.31.20.221:8300) (DC: dc1) 2015/02/20 00:24:45 [WARN] raft: Failed to get previous log: 119 log not found (last: 5) 2015/02/20 00:24:45 [INFO] scada-client: auto-joining WAN with [172.31.20.221] 2015/02/20 00:24:46 [INFO] agent: (WAN) joining: [172.31.20.221] 2015/02/20 00:24:46 [INFO] serf: EventMemberJoin: ip-172-31-20-221.dc1 172.31.20.221 2015/02/20 00:24:46 [INFO] agent: (WAN) joined: 1 Err: <nil> 2015/02/20 00:24:46 [INFO] consul: adding server ip-172-31-20-221.dc1 (Addr: 172.31.20.221:8300) (DC: dc1) 2015/02/20 00:25:01 [INFO] agent: Synced service 'consul'
どちらかのノードにログインし、consul membersを実行してクラスタのノード一覧を確認してみます。
$ ./consul members Node Address Status Type Build Protocol ip-172-31-20-221 172.31.20.221:8301 alive server 0.5.0 2 ip-172-31-20-106 172.31.20.106:8301 alive server 0.5.0 2 $
クラスタメンバーとして登録できていますね!
連携2: Hosted Consul UI
もう一つ、AtlasではConsul UIをAtlasの管理画面から参照することができます。Atlasの先ほどの画面にあるInfrastructure名をクリックすると、Consul UIの画面に遷移します。
[Overview]でクラスタの概要が見られます。
[Nodes]は各Consulのメンバーの様子です。
Hosted Consul UIは、以下のツイートの通りデモが公開されています。触ってみたい方はこちらをどうぞ。
We published the Consul demo cluster UI in Atlas as publicly viewable: https://t.co/hFZI7eCAeC (demonstrates the awesome ACLs in Atlas, too)
— Mitchell Hashimoto (@mitchellh) February 19, 2015
まとめ
Consul 0.5の新機能の一つとして、Atlas連携の様子をご紹介しました。Atlasの対応ラインナップは出揃った感じなので、そろそろAtlas独自の便利機能やプロダクト同士の連携機能が待ち遠しくなっちゃいますね。TerraformのConsul連携と今回のAtlas連携で何かすごいことができそうな気がしなくもないでしょうかね?(妄想